package com.mytransaction.core;

import com.mytransaction.manager.TransactionManager;
import net.sf.cglib.proxy.Enhancer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Proxy;

/**
 * 代理工厂，框架的入口
 * 负责智能判断并创建代理对象
 */
public class ProxyFactory {

    private static final Logger logger = LoggerFactory.getLogger(ProxyFactory.class);

    private final TransactionManager transactionManager;

    public ProxyFactory(TransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }

    /**
     * 获取代理对象
     * @param target 原始对象
     * @return 增强后的代理对象
     */
//    @SuppressWarnings("unchecked")
    public <T> T getProxy(T target) {
        // 创建统一的调用处理器
        TransactionInvocationHandler handler = new TransactionInvocationHandler(target, transactionManager);

        // 判断目标对象是否实现了接口
        if (target.getClass().getInterfaces().length > 0) {
            // 实现了接口，使用 JDK 动态代理
            logger.info("目标对象 [{}] 实现了接口，使用 JDK 动态代理。", target.getClass().getSimpleName());
            return (T) Proxy.newProxyInstance(
                    target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(),
                    handler
            );
        } else {
            // 未实现接口，使用 CGLIB 代理
            logger.info("目标对象 [{}] 未实现接口，使用 CGLIB 代理。", target.getClass().getSimpleName());
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(target.getClass()); // 设置父类
            enhancer.setCallback(handler); // 设置回调
            return (T) enhancer.create(); // 创建代理对象
        }
    }
}
